Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 13

Bài 11: Hãy cho biết kết quả (và lý do) của đoạn chương trình sau:

class Msg {
public Msg() {
System.out.println("Hello");
}
public void sayGoodbye() {
System.out.println("Goodbye");
}}
class TestMsg extends Msg {
public TestMsg() {
super();
System.out.println("Hello Java");
}
public void sayGoodbye() {
System.out.println("Goodbye Java");
}
}
public class Demo {
public static void main(String args[]) {
Msg m1 = new Msg();
Msg m2 = new TestMsg();
m1.sayGoodbye();
m2.sayGoodbye();
}
}

Kết quả: Hello


Hello
Hello Java
Goodbye
Goodbye Java
Giải thích: new Msg() gọi đến constructor không đối của class Msg
New TestMsg() gọi đến constructor không đối của Msg do super()
Và constructure không đối của TestMsg()
m1.sayGoodbye() và m2.sayGoodbye() gọi phương thức của các
class
Bài 12:
Hãy cho biết kết quả (và lý do) của đoạn chương trình sau:
class Msg {
public Msg() {
}
public Msg(String str) {
System.out.println("Hello" + str);
}
public void sayGoodbye() {
System.out.println("Goodbye");
}
}
class TestMsg extends Msg {
public TestMsg(String str) {
System.out.println("Hello" + str);
}
public void sayGoodbye() {
System.out.println("Goodbye Java");
}
}
public class Demo { public static void main(String args[]) {
Msg m1 = new Msg("Mark");
Msg m2 = new TestMsg("Java");
m1.sayGoodbye();
m2.sayGoodbye();
}
}

Kết quả: Hello Mark


Hello Java
Goodbye
Goodbye Java
Giải thích: new Msg(“Mark”) và new TestMsg(“Java”) truyền “Mark” và “Java” vào
constructor được kết quả Hello Mark, Hello Java
m1.sayGoodbye(), m2.sayGoodbye() gọi phương thức trong class in ra
string
Bài 13:
Hãy chỉ ra lỗi sai của đoạn chương trình sau:
class Msg {
public Msg() {
System.out.println("Hello");
}
public void sayGoodbye() {
System.out.println("Goodbye");
}
}
class TestMsg extends Msg {
public void sayGoodbye() {
System.out.println("Goodbye Java");
}
}
public class Demo {
public static void main(String args[]) {
Msg m1 = new Msg("OOP");
TestMsg m2 = new Msg();
m1.sayGoodbye();
m2.sayGoodbye();
}
}

Lỗi sai: class Msg không có constructor có đối để truyền tham số Msg(“OOP”)
TestMsg m2 = new Msg(); biến kiểu TestMsg không thể tham chiếu đến
đối tượng lớp cha

Bài 14:
Hãy chỉ ra lỗi sai của đoạn chương trình sau:
interface Action{
public void drive(){};
public void stop(){};
}
class Vehicle implements Action{
private int id;
public void Vehicle(int id){
this.id = id;
System.out.println("Hello world");
}
}
public class Demo {public static void main(String args[]){
Vehicle m = new Vehicle ();
}
}

Lỗi: định nghĩa phương thức interface sai, không có cặp dấu {}
Constructor không khai báo kiểu trả về, dùng void là sai
New Vehicle() chưa được truyền đối số
Bài 15:
Hãy chỉ ra lỗi sai của đoạn chương trình sau:
interface Action{
public void drive();
public void stop();
}
class Vehicle implements Action{
private int id;
public void Vehicle(int id){
this.id = id;
System.out.println("Hello world");
}
public void drive(){
System.out.println("I’m driving");
}
}
public class Demo {
public static void main(String args[]){
Vehicle m = new Vehicle ();
m.drive();
m.stop();
}
}

Lỗi: Constructor không được khai báo kiểu trả về, void là sai
New Vehicle() chưa được truyền đối số
Phương thức stop() chưa được override
Bài 16: Hãy cho biết kết quả (và lý do) của đoạn chương trình sau:
public class FileDemo{
public static void method1(File f1) {
String contents[] = f1.list();
for (int i=0; i< contents.length; i++){
System.out.println(contents[i] + "\n");
}
}
public static void main(String[] args){ method1
(new File("D:\\Documents\\utt"));
}
}

Kết quả: trả về tên các file con trong thư mục đường dẫn trên
Giải thích: phương thức method1() được gọi tryền vào đường dẫn thư mục,
phương thức list() của class File trả về mảng chứa tên các file con lưu vào
contents và for() để in tên các file ra
Bài 17:
Giải thích ý nghĩa và chỉ ra lỗi sai (giải thích) trong đoạn chương trình
sau:
interface ActionListener{
actionPerformed(ActionEvent e); }
class MyForm extends Frame implements ActionListener{
public MyForm(String title){
super(title);
setSize(300, 200);
setVisible(true);
}
}

Lỗi: thiếu kiểu trả về phương thức trong interface


Chưa override phương thức của interface trong class
Bài 18:
Giải thích ý nghĩa từ khóa super, toán tử this và Hãy chỉ ra lỗi sai của đoạn
chương trình sau:
class ThiSinh{
private String name;
public ThiSinh(String name){
this.name = name;
}
}
class ThiSinhA extends ThiSinh{
double toan, ly, hoa;
public ThiSinhA(String name,double toan, double ly,
double hoa){
super(name);
this.toan = toan;
this.ly = ly;
this.hoa = hoa;
}
public void display(){
System.out.println("Ho ten: " + this.name);
System.out.println("Tong
diem: " + (this.toan
+
this.ly + this.hoa));
}
}

super() để gọi các thành phần của class cha của đối tượng hiện tại
this để tham chiếu các đối tượng như thuộc tính, phương thức
Lỗi: thuộc tính name phải là protected để phương thức display() trong class
ThiSinhA có thể sử dụng
Bài 19:
Cho đoạn chương trình sau:public class Demo {
public static void main(String args[]) {
int value;
try
{
value = Integer.parseInt(args[0]);
System.out.println(“value = “ + value);
}
catch(NumberFormatException ex)
{
ex.printStackTrace();
}
}
}
Hãy giải thích ý nghĩa của try – catch trong đoạn chương trình trên. Cho biết
kết quả nếu thực thi chương trình trên nếu args[0] = “10” và trường hợp args[0] =
“A10”.

Giải thích: khối lệnh có thể gậy ngoại lệ nằm trong try, catch sẽ xử lý nếu ngoại
lệ xảy ra. Ở đây catch đang bắt lỗi NumberFormat là chuyển một chuỗi không
phải số sang int
Nên nếu args[0] = “10” sẽ in ra value = 10
args[0] = “A10” sẽ thông báo ngoại lệ vì đây không phải số, không
chuyển sang int được
Bài 20:
Giả sử lớp Shape và Point được hiện thực như ở dưới. Phát biểu Point p = new
Point(5,5); sẽ in ra màn hình nội dung gì? Giải thích.
class Shape {
public Shape() {
draw();
}
public void draw() {}
}
class Point extends Shape {
protected int x, y;
public Point(int xx, int yy) {
x = xx; y = yy;
}
public void draw() {
System.out.println("(" + x + "," + y + ")");
}
}

Kết quả: (0, 0) vì khi constructor Point được gọi, các phương thức Shape được
thực hiện nhưng lại gọi draw() của Point nên Point() chưa được khởi tạo nên sẽ
có giá trị mặc định
Bài 21:
Chương trình dưới đây sẽ in ra màn hình nội dung gì? Giải thích.
class Base {
private void f() { System.out.println("base f()"); }
public void show() { f(); }
}
public class Derived extends Base {
public void f() {
System.out.println("derived f()");
}
public static void main(String[] args) { Derived d = new Derived();
Base b = d;
b.show();
d.show();
}
}

b được tham chiếu tới đối tượng lớp kế thừa Derived


b.show() gọi show() của Base rồi gọi đến f() của Base
d.show() gọi show() của Base do d không ghi đè nên kế thừa Base, sau đó gọi
đến f() của Derived do đã override
Kết quả: base f()
derived f()
Bài 22:
Giả sử lớp Person và phương thức main() được cài đặt như sau
pubic class Person{
private String name;
public Person(String n){
name=n;
}
public void setName(String n){
name=n;
}
public void print(){
System.out.println(name);
}
}
public static void main(String[] args){
Person p1=new Person(“Nemo”);
Person p2=p1;
p1.setName(“Dory”);
p1.print();
p2.print();
}
Hãy cho biết nội dung gì sẽ được in ra màn hình. Giải thích.

Giải thích: do p1, p2 cùng tham chiếu đối tượng Person nên khi
setName(“Dory”) thực hiện sẽ thay đổi thuộc tính name cả hai nên khi gọi
phương thức print() của p1,p2 sẽ đều in ra “Dory”
Kết quả: Dory
Dory
Bài 23:
Chương trình dưới đây sẽ in ra màn hình nội dung gì? Giải thích.
class Base {
private void f() { System.out.println("base f()"); }
public void show() { f(); }
}
public class Derived extends Base {
public void f() {
System.out.println("derived f()");
}
public static void main(String[] args) { Derived d = new Derived();
Base b = d;
b.show();
d.show();
}
}

b được tham chiếu tới đối tượng lớp kế thừa Derived


b.show() gọi show() của Base rồi gọi đến f() của Base
d.show() gọi show() của Base do d không ghi đè nên kế thừa Base, sau đó gọi
đến f() của Derived do đã override
Kết quả: base f()
derived f()

Bài 25:
Giả sử lớp Person và phương thức main() được cài đặt như sau
pubic class Person{
private String name;
public Person(String n){
name=n;
}
public void setName(String n){
name=n;
}
public void print(){
System.out.println(name);
}
}
public static void main(String[] args){
Person p1=new Person(“Nemo”);
Person p2=p1;
p1.setName(“Dory”);
p1.print();
p2.print();
}
Hãy cho biết nội dung gì sẽ được in ra màn hình. Giải thích.

Giải thích: do p1, p2 cùng tham chiếu đối tượng Person nên khi
setName(“Dory”) thực hiện sẽ thay đổi thuộc tính name cả hai nên khi gọi
phương thức print() của p1,p2 sẽ đều in ra “Dory”
Kết quả: Dory
Dory

Bài 26:
Cho cây kế thừa như hình vẽ:
Shape
public void draw()

Circle Rectangle
public void draw() public void draw()

Square
public void draw()
Giả sử có phương thức boolean compare(Shape s1, Shape s2).
Gọi compare(c1,c2) với c1, c2 là hai tham chiếu đến hai đối tượng
thuộc lớp Circle có được hay không? Giải thích.

Bài 28:
Cho cây kế thừa như hình vẽ:
Shape
public void draw()

Circle Rectangle
public void draw() public void draw()

Square
public void draw()
Giả sử có phương thức show(Shape s) được cài đặt và sử dụng như ở dướivoid
show(Shape s){
s.draw();
}
Shape c=new Circle();
show(c);
Phương thức draw() được cài đặt trong lớp nào sẽ được gọi. Giải thích.

Giải thích: draw() trong Circle sẽ được gọi do c tuy kiểu Shape nhưng tham
chiếu tới đối tượng Circle mà draw trong Circle đã được override nên sẽ gọi đến
draw() của Circle
Bài 29:
Giả sử lớp Shape và Point được hiện thực như ở dưới. Phát biểu Point p = new
Point(5,5); sẽ in ra màn hình nội dung gì? Giải thích.
class Shape {
public Shape() {
draw();
}
public void draw() {}
}
class Point extends Shape {
protected int x, y;
public Point(int xx, int yy) {
x = xx; y = yy;
}
public void draw() {
System.out.println("(" + x + "," + y + ")");
}
Kết quả: (0, 0) vì khi constructor Point được gọi, các phương thức Shape được
thực hiện nhưng lại gọi draw() của Point nên Point() chưa được khởi tạo nên sẽ
có giá trị mặc định

Bài 30:
Định nghĩa 02 giao diện (interface) và 01 lớp cài đặt cả 2 giao diện đấy. Giải thích.
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int percent);
}
public class Shape implements Drawable, Resizable {
@Override
public void draw() {

System.out.println("Drawing a shape");
}

@Override
public void resize(int percent) {
System.out.println("Resizing shape by " + percent + "%");
}
}

Giải thích: 2 interface khai báo nguyên mẫu draw() của Drawable và resize() của
Resizable, class Shape cài đặt sẽ định nghĩa cho 2 phương thức trên của
interface
Bài 31:
Cho ví dụ để phân biệt quan hệ is-a và has-a. Giải thích.
class Shape {
}
class Circle extends Shape {
}
Quan hệ is-a chỉ mối quan hệ kế thừa như ví dụ trên Circle kế thừa Shape
Circle “is-a” Shape
Bài 32:
Hãy chỉ ra lỗi sai của đoạn chương trình sau. Giải thích.
class MyDate {
int year, month, day;
public MyDate(int y, int m, int d) {
year = y; month = m; day = d;
}
public void copyTo(final MyDate d) {
d.year = year;
d.month = month;
d.day = day;
d = new MyDate(year, month, day);
}...
}
Giải thích: do d được khai báo final là một hằng không thể đổi mà dòng new MyDate()
đang gán d thành một đối tượng khác nên sẽ lỗi. Có thể xóa dòng dưới đây hoặc không
khai báo d là final nữa
d = new MyDate(year, month, day);

Bài 33:
Hãy chỉ ra lỗi sai của đoạn chương trình sau. Giải thích.
class Bike {
final int speedlimit = 90;//bien final
void run() {
speedlimit = 400;
}
public static void main(String args[]) {
Bike obj = new Bike();
obj.run();
}
}

Giải thích: run() được gọi để gán lại speedlimit = 400 nhưng speedlimit đang là final
nên sẽ lỗi
Bài 34:
Hãy chỉ ra lỗi sai của đoạn chương trình sau. Giải thích.
class Bike {
final void run() {
System.out.println("running");
}
}
class Honda extends Bike {
void run() {
System.out.println("Chay an toan voi 100kmph");
}
public static void main(String args[]) {
Honda honda = new Honda();
honda.run();
}
}

Giải thích: run() trong Honda đang override lại run() của Bike nhưng run() của Bike là
final nên không thể ghi đè lại
Bài 35:
Hãy chỉ ra lỗi sai của đoạn chương trình sau, giải thích?
class Parent {
public void doSomething() {}
private int doSomething2() {
return 0;
}
}
class Child extends Parent {
protected void doSomething() {}
private void doSomething2() {}
}

Giải thích: Child đang override lại doSomething2() của Parent nhưng phương
này ở class cha là private nên không thể ghi đè lại ở class ngoài Parent và kiểu
dữ liệu trả về cũng phải giống so với class cha.
Child đang override lại doSomething() nhưng phạm vi truy cập đang nhỏ hơn
class Parent, theo quy tắc ghi đè là phải bằng hoặc lớn hơn
Bài 36:
Hãy chỉ ra lỗi sai của đoạn chương trình sau, giải thích?
class Parent {
public void doSomething() {}
private int doSomething2() {
return 0;
}
}
class Child extends Parent {
protected void doSomething() {}
private void doSomething2() {}
}

Giải thích: Child đang override lại doSomething2() của Parent nhưng phương
này ở class cha là private nên không thể ghi đè lại ở class ngoài Parent và kiểu
dữ liệu trả về cũng phải giống so với class cha.
Child đang override lại doSomething() nhưng phạm vi truy cập đang nhỏ hơn
class Parent, theo quy tắc ghi đè là phải bằng hoặc lớn hơn

Bài 37:
Hãy cho biết kết quả (và lý do) của đoạn chương trình sau:
class Point {
protected int x, y;
public Point() {
System.out.println("Point constructor");
}
}
class Circle extends Point {
protected int radius;
public Circle() {
System.out.println("Circle constructor");
}
public static void main(String[] args){
Circle c = new Circle();
}}

Kết quả: Point constructor


Circle constructor
Giải thích: new Circle() gọi constructor của Circle, nhưng trước khi các phương thức
claas con được thực hiện thì constructor của class cha sẽ được gọi đầu tiên nên cả 2
constructor của Circle và Point đều được gọi
Bài 38:
Hãy cho biết kết quả (và lý do) của đoạn chương trình sau:
class Base {
private void f() { System.out.println(”base f()”); }
public void show() { f(); }
}
public class Derived extends Base {
public void f() {
System.out.println(”derived f()”);
}
public static void main(String args[]) {
Derived d = new Derived(); Base b = d;
b.show();
d.show();
}
}

b được tham chiếu tới đối tượng lớp kế thừa Derived


b.show() gọi show() của Base rồi gọi đến f() của Base
d.show() gọi show() của Base do d không ghi đè nên kế thừa Base, sau đó gọi
đến f() của Derived do đã override
Kết quả: base f()
derived f()

You might also like