ヤマムギ

growing hard days.

*

Java SE 7 Silver 試験対策セミナーで模擬問題の解説をマークダウンでメモってみた

      2015/03/29

Java SE 7 Silver 試験対策セミナーに行って、模擬問題にチャレンジしてきました。
問題の解説をAtomを使ってマークダウンでメモしてたので、JetPack Markdownを使ってそのまま記事にしてみました。
※あくまでもメモなので、なんとなくで読んでもらえば幸いです。

スコープ

[java]
package ken;

class Target{
public String name = "hello";
}
[/java]

  • nameはkenパッケージ内のすべてのクラスが直接アクセスして編集可能
アクセス修飾子 クラス コンストラクタ メンバ変数 メソッド 説明
public o o o o どのクラスからでも
protected x o o o このクラスを継承したサブクラス、もしくは同一パッケージ内のクラスから
デフォルト(指定なし) o o o o 同一パッケージ内のクラスからのみ
private x o o o 同一クラス内からのみ

※リフレクションを使用した場合を除く

[java]
package util;
public class BuiltUtils{
private static void process(byte[] b){
}
}
[/java]

[java]
package app;
public class someApp{
public static void main(String[] args){
byte[] bytes = new byte[256];
}
}
[/java]

  • BitUtilsクラスのprocessメソッドはアクセス修飾子がpraivateなのでSomeAppクラスからは使用できない

継承と修飾子

[java]
class ClassA{
public int numberOfInstances;
protected ClassA(int numberOfInstances){
this.numberOfInstances = numberOfInstances;
}
}

public class ExtendedA extends ClassA {
private ExtendedA(int numberOfInstances){
super(numberOfInstances);
}
public static void main(String[] args){
ExtendedA ext = new ExtendedA(420);
System.out.println(ext.numberOfInstances);
}
}
[/java]

  • サブクラスExtendedAで明示的にスーパークラスClassAの引数1つのコンストラクタを呼び出しているのでエラーにはならない。
  • コンストラクタにはpublic,protected,privateなどすべてのアクセス修飾子を指定可能
  • private ExtendedAコンストラクタは自クラス内からしか参照できない。ExtendedA extは自クラス内なのでOK
  • protected ClassAコンストラクタは同じパッケージかこのクラスを継承したクラスからしか参照できない。super(numberOfInstances)はサブクラスなのでOK。

[java]
public interface A4 {
public void doSomething(String thing);
}

class AImpl implements A4{
public void doSomething(String thing){}
}

class B4{
public A4 doit(){

}

class C4 extends B4{
public AImpl doit(){

}
[/java]

  • class C4のpublic Object execute()でコンパイルエラーとなる
  • クラスBのexecute()メソッドをオーバーライドしようとしているが戻り値がStringではなくObjectになっている
  • メッソドのオーバーライドを行う際、戻り値はスーパークラスの同名メソッドと同じかサブクラスでないとならない

[java]
public interface A111{
String s = “yo”;
public void mehod1();
}

interface B{}

interface C extends A111,B{
public void method1();
public void method1(int x);
}
[/java]

  • インターフェースは多重継承ができるのでOK(クラスはNG)
  • interface C のmethod1()は同じpublic(公開範囲は狭くなっていない)なので問題ない
  • interface C のmethod1(int x)は新たに抽象メソッドを定義しているだけ
  • String s=”yo”はインターフェース内の変数宣言なのでコンパイル時に暗黙的に定数扱い(public static final)となる

[java]
abstract public class Employee{
protected abstract double getSalesAmount();
public double getCommission(){
return getSalesAmount() * 0.15;
}
}

class Sales extends Employee{
public double getSalesAmount(){return 123.45;}
}
[/java]

  • Employee.getSalesAmount()メソッドのアクセス修飾子はprotected
  • protectedよりも狭くない公開範囲のprotected,publicであればOK
  • private,修飾子なしはNG

[java]
interface Data{public void load();}
abstract class Info{public abstract void load();}
[/java]

[java]
public class Employee extends Info implements Data{
public void load(){/* do something */}
}
[/java]

  • extends(クラスの継承)とimplements(インターフェース)ではextends(クラスの継承)を先に記載する
  • 抽象クラス.メソッド,インターフェース.メソッドといった書き方はない

コンストラクタ

[java]
public class Hello {
String title;
int value;
public Hello(){
title += ” World”;
}
public Hello(int value){
this.value=value;
title=”Hello”;
Hello();
}
}

class TesterHello{
public static void main(String[] args){
Hello c=new Hello(5);
System.out.println(c.title);
}
}
[/java]

  • Hello();でコンパイルエラーとなる
  • 引数ありのコンストラクタから自クラスのコンストラクタを通常のメソッドのように呼び出す事はできない
  • 上記の中で呼び出す場合はthis();をpublic Hello(int value){のすぐ後で呼び出す必要がある

[java]
public class Planet{
private String name;
public Planet(String name){
this.name = name;
}
public String getName(){
return name;
}
}
[/java]

[java]
public class Tree extends Planet{
public void growFruit(){}
public void drawLeaves(){}
}
[/java]

  • Treeクラスにはコンストラクタがないのでコンパイル時に引数のないコンストラクタが生成される
  • TreeクラスはPranetクラスのサブクラスなので最初にsuper(引数)がない場合、自動的にスーパークラスのデフォルトコンストラクタが実行される
  • Planetクラスには引数ありのコンストラクタがあるので、引数なしのデフォルトコンストラクタが生成されないのでコンパイルエラーとなる
  • なので、PlanetクラスにPublic Planet(){this(“fern”)}などを追加すればコンパイルできる

[java]
class Person{
String name = “No name”;
public Person(String nm){
name = nm;
}
}

class Employee extends Person{
String empID = “0000”;
public Employee(String id){
empID = id;
}
}

public class EmployeeTest{
public static void main(String[] args){
Employee e = new Employee(“4321”);
System.out.println(e.empID);
}
}
[/java]

  • Employeeクラスのコンストラクタ内でコンパイルエラーとなる
  • EmployeeクラスはPersonクラスのサブクラス
  • Employeeクラスでは明示的なスーパークラスのコンストラクタ呼び出しがないのでPersonクラスのデフォルトコンストラクタPerson()が呼び出される
  • Personクラスには引数ありのコンストラクタを書いてしまっているのでデフォルトコンストラクタPerson()が生成されない
  • Employeeクラスのコンストラクタの最初でsuper(id);のように呼びだせばOK

[java]
class Employee{
String name;
double baseSalary;
Employee(String name,double baseSalary){
this.name = name;
this.baseSalary = baseSalary;
}
}

public class SalesPerson extends Employee{
double commission;
public SalesPerson(String name,double baseSalary,double commission){
//insert code
}
}
[/java]

  • SalesPersonクラスのコンストラクタ内でコンパイルエラーとなる
  • SalesPersonクラスはEmployeeクラスのサブクラス
  • SalesPersonクラスでは明示的なスーパークラスのコンストラクタ呼び出しがないのでEmployeeクラスのデフォルトコンストラクタEmployee()が呼び出される
  • Employeeクラスには引数ありのコンストラクタが定義されてしまっているのでデフォルトコンストラクタが生成されない
  • SalesPersonクラスのコンストラクタの最初でsuper(name,baseSalary);のように呼び出せばOK

例外

[java]
class A{
public void method1(){
B b = new B();
b.method2();
System.out.println(“class A”);
}
}

class B{
public void method2(){
C c = new C();
c.method3();
System.out.println(“class B”);
}
}

class C{
public void method3(){
String nullStr=null;
System.out.println(nullStr.length());
}
}

public class tryTest {
public static void main(String[] args){

[/java]

  • NullPointerExceptionは非チェック例外なのでメソッドにthrowsの指定がなくても必ず呼び出し元に送出される。
  • なので、an error occurredが表示される

[java]
public class A2 {
void foo() throws Exception{
throw new Exception();
}
}

class SubB2 extends A2{
void foo(){
System.out.println(“B “);
}
}

class Tester{
public static void main(String[] args){
A2 a = new SubB2();
a.foo();
}
[/java]

  • throws句があるのに例外処理がないからコンパイルエラーとなる
  • throws句はサブクラスで指定しなくてもオーバーライドされる

[java]
public class A3 {
public void method1(){
try{
B3 b=new B3();
b.method2();
}catch(TestException te){
throw new RuntimeException(te);
}
}
}

class B3{
public void method2() throws TestException{

}

class Tester3{
public void method(){
A3 a = new A3();
a.method1();
}
}

public class TestException extends Exception{

}
[/java]

  • 非チェック例外はコンパイル時にチェックされない
  • チェック例外はコンパイルエラーになる
  • method1()はRuntimeExceptionをthrowしている
  • RintimeExceptionは非チェック例外、なので呼び出し元で例外処理がなくてもいい
  • TestExceptionはExceptionのサブクラスとして作ったものなので例外処理が必要

キャスト

[java]
public class Base1 {
public static final String FOO = “foo”;
public static void main(String[] args){
Base1 b = new Base1();
Sub1 s = new Sub1();
System.out.print(Base1.FOO);
System.out.print(Sub1.FOO);
System.out.print(b.FOO);
System.out.print(s.FOO);
System.out.print(((Base1)s).FOO);
}
}

class Sub1 extends Base1{
public static final String FOO = “bar”;
}
[/java]

  • ((Base1)s).FOOはクラス変数sをキャストしてBASE1型にしているので、BASE1クラスのFOO変数の”foo”が表示される。

[java]
Object[] myObject = {new Integer(12),
new String(“foo”),
new Integer(2),
new Boolean(true)};

Arrays.sort(myObject);
[/java]

  • Exception in thread “main” java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Stringが発生する
  • Arrays.sortでArraysにキャストしようとしてExceptionが発生
  • Arraysは基本データ型(Integer,BooleanはOK)しか扱えない
  • Stringは参照型

[java]
public class TestString1{
public static void main(String[] args){
String str = “420”;
str += 42;
System.out.println(str);
}
}
[/java]

  • ストリング変数strに数字42を+=演算子で加えた結果strは42042となる

ループとラベル

[java]
public class Breaker2 {
static String o= “”;
public static void main(String[] args){

}
}
[/java]

  • 出力は24
  • continueは処理を1週とばす
  • break zはzラベルのついたfor文を終了する

カプセル化

[java]
public class FoobarCard{
private String CardID;
private Integer limit;
public String ownerName;

public void setCardInformation(String cardID,String ownerName,Integer limit){
this.cardID = cardID;
this.limit = limit;
this.ownerName = ownerName;
}
}
[/java]

  • 属性と操作を一体化させて表現することをカプセル化と呼ぶ
  • 実データであるインスタンス変数が他クラスからむやみに変更される事を防ぐために一般的にインスタンス変数はprivate指定が推奨
  • メソッドはpublic指定が推奨
  • public指定されているownerName変数がカプセル化を破壊しているといえる

最後までお読みいただきましてありがとうございました!

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。

 - Java, study , ,

ad

ad

  関連記事

「INEVITABLE ja night #7 コネクティッド社会に向けた不可避な流れ」で課題を持ち続けることの大切さを再認識した

INEVITABLE ja nightに参加しました。 今回特に思ったことは、 …

「XP祭り in 関西 2016 〜アジャイル15周年ふりかえり〜」に行ってきました

「XP祭り in 関西 2016 〜アジャイル15周年ふりかえり〜」に行ってきま …

「Serverless Days Tokyo 2023 重厚長大な企業の内製開発組織で成果を出すためのサーバーレスアーキテクチャ」を見ました

2023/9/23にServerless Days Tokyo 2023に参加し …

AWS Summit 2016 Tokyoに参加してきました (前日 ~ Day1)

AWS Summit 2016 Tokyoにて、セッション聴講、ブース展示拝見、 …

JAWS-UG CLI専門支部に初めて参加してIAM入門してきた

JAWS-UG CLI専門支部に初参加してきました。 会場は茅場町のコワーキング …

「JAWS-UG朝会 #20」に参加しました

恒例のラジオ体操からっ! はじめてのEKS Kubernetes案件 勉強方法 …

「IBM Cloud Community Summit 2018 フルマネージドデータベースというのは使えるのか?IBM Cloudでのデータ活用事例いろいろ」でIBm Cloudのデータベースサービスを聞かせていただいた

IBM Cloud Community Summit 2018におじゃましました …

「AWS認定 デベロッパーアソシエイトの試験に出るかもなデモ見せあいっこ(ヤマムギvol.12)」を開催しました

デモ勉強会を開催しました! 2021/4/7にヤマムギ12回目の勉強会「AWS認 …

ヤマムギvol.25 EC2にWordPressをインストールするデモをしました

今日はAWSではじめるLinux入門ガイドの17章に書いている「LinuxにWo …

「AWSの基礎を学ぼう 特別編 最新サービスをみんなで触ってみる Amplify + Admin UI」に参加しました。

亀田さんが定期開催というか、高頻度開催されている「AWSの基礎を学ぼう 特別編  …